/*
 * @Description: 读取配置文件
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2022-04-24 10:29:51
 * @LastEditTime: 2022-08-02 14:03:35
 */
import fs from 'node:fs'
import YAML from 'yaml'
import path from 'node:path'
import { IServerOpts } from '../lib/Micro.js'
import { IPoolOpts } from './useRedisPool.js'
import { RedisOptions } from './useRedis.js'

interface IObjAny {
    [key: string]: any
}

/* 数据库配置(多种数据库通用) */
export interface IDatabase {
    host?: string | '127.0.0.1' //数据库主机
    port: number //数据库端口
    database: string //要连接的数据库名称
    user?: string //此数据库账号、用户名(没有可为null)
    password?: string //数据库密码(没有可为null)
    connectionLimit?: number // 连接池一次创建的最大连接数（createPool()方法参数）
    acquireTimeout?: number // 在连接获取过程中发生超时之前的毫秒数（createPool()方法参数）
    connectTimeout?: number // 与 MySQL 服务器的初始连接期间发生超时之前的毫秒数（createConnection()方法参数）
    multipleStatements?: boolean, //允许传多条sql语句(createConnection()方法参数)
}

class Config {
    id: string
    static instance: Config

    server: IServerOpts // 微服务器配置
    db?: IDatabase // 数据库配置
    registerServer?: IServerOpts // 注册中心配置
    redis?: RedisOptions // redis配置
    redisPool?: IPoolOpts // 连接池配置
    common?: IObjAny // 公用、自定义

    constructor(path: string) {
        this.id = Date.now().toString()
        const yamlFile = fs.readFileSync(path, 'utf8')

        const {
            server,
            db,
            registerServer,
            redis,
            redisPool,
            common
        } = YAML.parse(yamlFile)

        this.server = server
        this.db = db
        this.registerServer = registerServer
        this.redis = redis
        this.redisPool = redisPool
        this.common = common
    }

    // 单例
    static getInstance(): Config {
        if (!Config.instance) {
            // 这里的"cwd"为获取根目录，使用pm2部署时可以在配置文件中进行配置（"cwd"参数）
            Config.instance = new Config(path.join(process.cwd(), 'application.yml'))
        }
        return Config.instance;
    }
}

// 导出单例
export default Config.getInstance